/*
 * @(#)XfvhdlInOrderParamMemFunc.java        3.0              2004/09/14
 *
 * This file is part of Xfuzzy 3.0, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfvhdl;

import xfuzzy.lang.*;
import java.util.*;

/**
* Clase que gestiona lista ordenada de funciones miembro.
* @author Jos� Mar�a �vila Maireles, <b>e-mail</b>: josavimai@alum.us.es
* @version 3.0
*/
public class XfvhdlInOrderParamMemFunc {

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //			ATRIBUTOS PRIVADOS DE LA CLASE 				        
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   @SuppressWarnings("rawtypes")
private List mf_sorted;
   private ParamMemFunc[] tmp;

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //				  CONSTRUCTOR DE LA CLASE					   
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   /**
    * Constructor de XFvhdlInOrderParamMemFunc
    */
   @SuppressWarnings("rawtypes")
public XfvhdlInOrderParamMemFunc(Variable v) {
      this.mf_sorted = new ArrayList();
      this.tmp = v.getType().getParamMembershipFunctions();
   }

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //			  M�TO_DOS PUBLICOS DE LA CLASE				        
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   /**
   * M�todo que devuelve la lista de funciones miembro.
   * @return Lista que contiene las funciones miembro.
   */
   @SuppressWarnings("rawtypes")
public List getInOrderParamMemFunc() {
      return mf_sorted;
   }

   /**
   * M�todo que devuelve el n�mero de funciones miembro que hay.
   * @return N�mero de funciones miembro que hay.
   */
   public int getSize() {
      return mf_sorted.size();
   }

   /**
   * M�todo que devuelve la funci�n miembro indexada por i.
   * @return Funci�n miembro i.
   */
   public ParamMemFunc getParamMemFunc(int i) {
      return (ParamMemFunc) mf_sorted.get(i);
   }

   /**
   * M�todo que devuelve la posici�n en la lista de una funci�n miembro
   * dada.
   * @param mf Funci�n miembro de la que queremos saber su posici�n.
   * @return �ndice de la funcion miembro dentro de la lista. 
   */
   public int getIndex(ParamMemFunc mf) {
      int index = -1;
      boolean enc = false;
      ParamMemFunc aux;

      for (int i = 0; i < mf_sorted.size() && !enc; i++) {
         aux = (ParamMemFunc) mf_sorted.get(i);
         if (aux.equals(mf.getLabel())) {
            index = i;
            enc = true;
         }
      }

      return index;
   }

   /**
   * 
   * M�todo que ordena la lista de funciones miembro.
   */
   @SuppressWarnings({ "rawtypes", "unchecked" })
public List sort() {
      boolean enc = false;

      for (int i = 0; i < tmp.length; i++) {
         if (mf_sorted.size() == 0) {
            mf_sorted.add(tmp[i]);
            enc = true;
         }

         for (int j = 1; j <= mf_sorted.size() && !enc; j++) {
            double a, b;
            a =
               opMemFuncParameter(
                  (ParamMemFunc) mf_sorted.get(j - 1),
                  "min");
            b = opMemFuncParameter(tmp[i], "min");
            if (a > b) {
               mf_sorted.add(j - 1, tmp[i]);
               enc = true;
            }
         }

         if (!enc) {
            mf_sorted.add(tmp[i]);
         }

         enc = false;
      }

      return mf_sorted;
   }

   /**
   * M�todo que devuelve el valor del menor par�metro de una funci�n 
   * miembro si se le pasa "min" o el m�ximo si se le pasa "max".
   * @param p Funci�n miembro de la que queremos saber su valor m�ximo
   * o m�nimo.
   * @param op Cadena "max" si buscamos el valor m�ximo o "min" si 
   * buscamos el m�nimo.
   * @return Valor buscado.
   */
   public double opMemFuncParameter(ParamMemFunc p, String op) {
      double param[] = p.get();
      double res;

      res = param[0];

      if (op.equalsIgnoreCase("min")) {
         for (int i = 1; i < param.length; i++) {
            if (param[i] < res)
               res = param[i];
         }
      } else if (op.equalsIgnoreCase("max")) {
         for (int i = 1; i < param.length; i++) {
            if (param[i] > res)
               res = param[i];
         }
      }

      return res;
   }
}
